package org.jeecg.modules.tt_question_collect.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.StringUtils;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.tt_question_collect.entity.TtAuditRecord;
import org.jeecg.modules.tt_question_collect.entity.TtQuestionCollect;
import org.jeecg.modules.tt_question_collect.mapper.TtAuditRecordMapper;
import org.jeecg.modules.tt_question_collect.mapper.TtCollectFlowMapper;
import org.jeecg.modules.tt_question_collect.mapper.TtCollectFlowNodeMapper;
import org.jeecg.modules.tt_question_collect.mapper.TtQuestionCollectMapper;
import org.jeecg.modules.tt_question_collect.service.ITtAuditRecordService;
import org.jeecg.modules.tt_question_collect.util.AuditNodeType;
import org.jeecg.modules.tt_question_collect.util.MsgTypeEnum;
import org.jeecg.modules.tt_question_collect.util.PushSysMsgUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Description: 审核记录表
 * @Author: jeecg-boot
 * @Date: 2021-02-02
 * @Version: V1.0
 */
@Service
public class TtAuditRecordServiceImpl extends ServiceImpl<TtAuditRecordMapper, TtAuditRecord>
        implements ITtAuditRecordService {
    @Resource
    private TtAuditRecordMapper ttAuditRecordMapper;

    @Resource
    private TtCollectFlowNodeMapper auditNodeMapper;

    @Resource
    private TtQuestionCollectMapper ttQuestionCollectMapper;

    @Autowired
    private TtCollectFlowMapper ttCollectFlowMapper;

    @Autowired
    private TtQuestionCollectServiceImpl ttQuestionCollectService;

    @Autowired
    private PushSysMsgUtil pushSysMsgUtil;

    @Transactional
    @Override
    public List<String> TtAuditRecordSp(String lclx) {

        // 获取登录用户信息
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        String userId = sysUser.getId();
        List<String> isnew = ttAuditRecordMapper.queryisnew(userId,lclx);
        if (null != isnew && isnew.size() > 0) {
            if (isnew.get(0) == "0") {
                System.out.println("未到此审批人审批，未审批");
            }
            else if (isnew.get(0) == "1") {
                System.out.println("已到此审批人审批，待审批");
            }
            else if (isnew.get(0) == "2") {
                System.out.println("此审批人已审批，已审批");
            }
        }
        return isnew;
    }

    // 查询是否还有其他人未进行审核
    //为true是没有其他人进行审核了，为false是还有其他人要进行审核
    public boolean TtAuditRecordQuery(String tableid, String sortid,String lclx) {
        Long model = ttAuditRecordMapper.queryisqtsh(tableid, sortid,lclx);
        return 1 < model ? false : true;
    }

    // 判断是否是最后一个节点
    public boolean QueryisEndNode(String sortid, String tableid,String lclx) {
        Long model = ttAuditRecordMapper.queryisend(sortid, tableid,lclx);

        return 0 < model ? false : true;
    }

    //当下一级的isnew=1时
    @Override
    public Result<?> querynextaudit(String id, String lclx) {

            TtAuditRecord ttAuditRecord =   getById(id);
        TtQuestionCollect ttQuestionCollect =  ttQuestionCollectService.getById(ttAuditRecord.getTableid());

        String nextsorid = String.valueOf((Integer.valueOf(ttAuditRecord.getSortid()) + 1));
        //查询下一级有无此问题提出人
        List<Map<String,Object>>  res =  auditNodeMapper.queryspusersftcuser(ttAuditRecord.getTableid(),nextsorid);

        for (int i = 0; i <res.size() ; i++) {
            //判断需求提出人是否在此级别审核流程中存在
            if (ttQuestionCollect.getCreateById().equals(res.get(i).get("AUDITUSERID"))) {
                //有---默认通过此人
                audit(res.get(i).get("ID").toString(),"1",null,"wtlx",null);
            }
        }

        return null;
    }

    @Override
    public String getflowid(String proname) {
        return ttAuditRecordMapper.getflowid(proname);
    }

    public void updateisnew(String sortid,String lclx,String tableid) {
        ttAuditRecordMapper.updatenew(sortid,lclx,tableid);
    }

    // 更新当前sortid级别的所有isnew
    public void updateotherisnew(String sortid, String auditId,String lclx,String tableid) {
        ttAuditRecordMapper.updateotherisnew(sortid, auditId,lclx,tableid);
    }

    // 更新当前记录除外的sortid级别的所有shbj
    public void updateothershbj(String tableid, String recordId, String sortid,String lclx) {
        ttAuditRecordMapper.updateothershbj(tableid, recordId, sortid,lclx);
    }

    // 更新当前记录除外的sortid级别的所有shbj为通过，当选择随机审核和任意审核后，其中一人审核通过后执行此方法
    public void updateothershbjtg(String sortid, String id,String lclx) {
        ttAuditRecordMapper.updateothershbjtg(sortid, id,lclx);
    }

    //问题审批
    @Override
    @Transactional
    public Result<?> audit(String id, String shbj, String auditoption,String lclx,String spyijian) {

        /**
         * 1、更新本条审核记录； 2、判断本次审核结果，退回直接退回本次审核，同级别及以下级别所有记录审核标记更改为3；
         * 3、审核通过，判断是否最后节点和当前节点是否审核完毕； 3.1 当前节点是否还有未审核的记录； 3.2
         * 有未审核的，根据节点类型来判断，随机，任意的通过直接进入下一级，全部的 4、是最后节点，全部审核完毕，更改标记，未全部审核完毕不做更改；
         * 5、非最后节点，全部审核完毕，进入下一级节点审核，未全部审核完毕不做更改；
         */
        String msgPushCode = "";
        TtAuditRecord ttAuditRecord = getById(id);
        if (null == ttAuditRecord) {
            return Result.error("未查询到当前审核记录！");
        }
        if (!"1".equals(ttAuditRecord.getIsnew())) {
            return Result.error("已审核或者未到审核！");
        }
        if (StringUtils.isEmpty(shbj)) {
            return Result.error("参数不可为空！");
        }
        if (oConvertUtils.isEmpty(auditoption)) {
            auditoption = "";
        }

        ttAuditRecord.setShbj(shbj);
        ttAuditRecord.setAudittime(new Date());
        ttAuditRecord.setAuditoption(auditoption);
        ttAuditRecord.setIsnew("2");
        ttAuditRecord.setSpyijian(spyijian);


        // 进入审核流程
        TtQuestionCollect ttQuestionCollect = ttQuestionCollectService.getById(ttAuditRecord.getTableid());
        String nextSortId = String.valueOf((Integer.valueOf(ttAuditRecord.getSortid()) + 1));
        // 查询是否还有其他人未进行审核
        boolean isQtrSh = TtAuditRecordQuery(ttAuditRecord.getTableid(), ttAuditRecord.getSortid(),lclx);
        // 判断是否是最后一个节点
        boolean isEndNodes = QueryisEndNode(nextSortId, ttAuditRecord.getTableid(),lclx);

        if ("2".equals(shbj)) {
            updateothershbj(ttAuditRecord.getTableid(), ttAuditRecord.getId(), ttAuditRecord.getSortid(),lclx);
            ttQuestionCollect.setAuditstatus("3");
            ttQuestionCollect.setBackcause(auditoption);
            ttQuestionCollect.setCreateTime(null);
            ttQuestionCollectMapper.updateById(ttQuestionCollect);
            msgPushCode = MsgTypeEnum.A03.getMsgTpeCode();
        }
        else if ("1".equals(shbj)) {
            if (isQtrSh) {
                if (isEndNodes) {
                    ttQuestionCollect.setAuditstatus("2");
                    ttQuestionCollect.setCreateTime(null);
                    ttQuestionCollectMapper.updateById(ttQuestionCollect);
                    msgPushCode = MsgTypeEnum.A04.getMsgTpeCode();
                }
                else {
                    updateisnew(nextSortId,lclx,ttAuditRecord.getTableid());
                    msgPushCode = MsgTypeEnum.A02.getMsgTpeCode();
                }
            }
            else {
                if (AuditNodeType.NODE_CHILD_ARBITRARILY.equals(ttAuditRecord.getAuditrange())) {
                    if (isEndNodes) {
                        ttQuestionCollect.setAuditstatus("2");
                        ttQuestionCollect.setCreateTime(null);
                        ttQuestionCollectMapper.updateById(ttQuestionCollect);
                        msgPushCode = MsgTypeEnum.A04.getMsgTpeCode();
                    }
                    else {
                    	//1111
                        updateisnew(nextSortId,lclx,ttAuditRecord.getTableid());
                        msgPushCode = MsgTypeEnum.A02.getMsgTpeCode();
                    }
                    updateotherisnew(ttAuditRecord.getSortid(), ttAuditRecord.getId(),lclx,ttAuditRecord.getTableid());
                }
            }
        }
        ttAuditRecord.setAudittime(new Date());
        updateById(ttAuditRecord);

        //判断此级别下一级是否为待审批
        String isnew =  auditNodeMapper.getisnewzt(ttAuditRecord.getTableid(),nextSortId);
        if("1".equals(isnew)){
            querynextaudit(id,"wtlx");
        }

        try {
            pushSysMsgUtil.sendMessage(msgPushCode, ttAuditRecord.getTableid());
        }
        catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return Result.OK("审核成功！",ttQuestionCollect);
    }

    //方案审批
    @Override
    @Transactional
    public Result<?> fasp(String id, String fashbj, String auditoption,String lclx) {

        String msgPushCode = "";
        TtAuditRecord ttAuditRecord = getById(id);

        if (null == ttAuditRecord) {
            return Result.error("未查询到当前审核记录！");
        }
        if (!"1".equals(ttAuditRecord.getIsnew())) {
            return Result.error("已审核或者未到审核！");
        }
        if (StringUtils.isEmpty(fashbj)) {
            return Result.error("参数不可为空！");
        }
        if (oConvertUtils.isEmpty(auditoption)) {
            auditoption = "";
        }

        ttAuditRecord.setShbj(fashbj);
        ttAuditRecord.setAudittime(new Date());
        ttAuditRecord.setAuditoption(auditoption);
        ttAuditRecord.setIsnew("2");

        // 进入审核流程
        TtQuestionCollect ttQuestionCollect = ttQuestionCollectService.getById(ttAuditRecord.getTableid());
        String nextSortId = String.valueOf((Integer.valueOf(ttAuditRecord.getSortid()) + 1));
        // 查询是否还有其他人未进行审核
        boolean isQtrSh = TtAuditRecordQuery(ttAuditRecord.getTableid(), ttAuditRecord.getSortid(),lclx);
        // 判断是否是最后一个节点
        boolean isEndNodes = QueryisEndNode(nextSortId, ttAuditRecord.getTableid(),lclx);

        if ("2".equals(fashbj)) {
            updateothershbj(ttAuditRecord.getTableid(), ttAuditRecord.getId(), ttAuditRecord.getSortid(),lclx);
            ttQuestionCollect.setFashbj("3");
            ttQuestionCollect.setFabackcause(auditoption);
            ttQuestionCollectMapper.updateById(ttQuestionCollect);
            msgPushCode = MsgTypeEnum.A09.getMsgTpeCode();
        }
        else if ("1".equals(fashbj)) {
            if (isQtrSh) {
                if (isEndNodes) {
                    ttQuestionCollect.setFashbj("2");
                    //添加进入开发任务时间
                    ttQuestionCollect.setGodevtime(new Date());
                    ttQuestionCollectMapper.updateById(ttQuestionCollect);
                    msgPushCode = MsgTypeEnum.A010.getMsgTpeCode();
                }
                else {
                    updateisnew(nextSortId,lclx,ttAuditRecord.getTableid());
                    msgPushCode = MsgTypeEnum.A08.getMsgTpeCode();
                }
            }
            else {
                if (AuditNodeType.NODE_CHILD_ARBITRARILY.equals(ttAuditRecord.getAuditrange())) {
                    if (isEndNodes) {
                        ttQuestionCollect.setFashbj("2");
                        //添加进入开发任务时间
                        ttQuestionCollect.setGodevtime(new Date());
                        ttQuestionCollectMapper.updateById(ttQuestionCollect);
                        msgPushCode = MsgTypeEnum.A010.getMsgTpeCode();
                    }
                    else {
                        updateisnew(nextSortId,lclx,ttAuditRecord.getTableid());
                        msgPushCode = MsgTypeEnum.A08.getMsgTpeCode();
                    }
                    updateotherisnew(ttAuditRecord.getSortid(), ttAuditRecord.getId(),lclx,ttAuditRecord.getTableid());
                }
            }
        }
        ttAuditRecord.setAudittime(new Date());
        updateById(ttAuditRecord);

        querynextusersp();

        try {
            pushSysMsgUtil.sendMessage(msgPushCode, ttAuditRecord.getTableid());
        }
        catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return Result.OK("审核成功！");
    }




    public void  querynextusersp(){
        //查询下一级审批人中有无问题提出人

    }




    public static void main(String[] args) {
        System.out.println(String.valueOf((Integer.valueOf("1") + 1)));
    }

    @Override
    public List<Map<String, Object>> getshjl(String tableid,String lclx) {
        // TODO Auto-generated method stub
        return ttAuditRecordMapper.getshjl(tableid,lclx);
    }

    @Override
    public List<Map<String, Object>> queryCollectFlowSList(String id, String scbj,String lclx) {
        // TODO Auto-generated method stub
        return ttAuditRecordMapper.getlist(id, scbj, lclx);
    }

    @Override
    public List<TtAuditRecord> queryAuditListByQuestionCode(String questionCode,String lclx) {
        return ttAuditRecordMapper.queryAuditListByQuestionCode(questionCode,lclx);
    }

    @Override
    public TtAuditRecord queryAuditBackListByQuestionCode(String questionCode,String lclx) {
        return ttAuditRecordMapper.queryAuditBackListByQuestionCode(questionCode,lclx);
    }

	@Override
	public String getbyname(String flowCode) {
		// TODO Auto-generated method stub
		return ttCollectFlowMapper.getbyname(flowCode);
	}

    @Override
    public void upatefazt(String id, String lclx) {
        ttAuditRecordMapper.upatefazt(id,  lclx);
    }
}
